var request = require('request')  // 引入request模块

var HttpRequestUtil = {
    /**
     * get请求
     * @param url 请求地址
     * @param callback 回调
     */
    getReq: function (url, callback) {
        request(url, function (error, response, body) {
            resultFn(callback, error, response, body)
        })
    },

    /**
     * application/x-www-form-urlencoded post请求
     * @param url 请求地址
     * @param data 请求参数
     * @param callback 回调
     */
    postForm: function (url, data, callback) {
        var option = {
            url: url,
            headers: this.getHeader({'content-type': 'application/x-www-form-urlencoded'}),
            form: data
        }
        request.post(option, function (error, response, body) {
            resultFn(callback, error, response, body)
        })
    },

    /**
     * post json请求
     * @param param
     * @param callback
     */
    postJson: function (param, callback) {
        var option = {
            url: param.url,
            method: "POST",
            headers: this.getHeader({}),
            body: param.data ? JSON.stringify(param.data) : {}
        }
        request(option, function (error, response, body) {
            resultFn(callback, error, response, body)
        })
    },

    /**
     * multipart/form-data post请求 文件上传
     * @param url 请求地址
     * @param data 请求参数
     * @param callback 回调
     */
    postFormData: function (url, data, callback) {
        var option = {
            url: url,
            formData: data
        }
        request.post(option, function (error, response, body) {
            resultFn(callback, error, response, body)
        })
    },

    /**
     *  定义请求头部的封装
     * @param httpConfig
     * @returns {{"Content-type": (*|string)}}
     */
    getHeader(httpConfig) {
        return {
            /*
             * 定义提交数据方式: application/x-www-form-urlencoded  multipart/form-data  application/json text/html
             *
             * application/x-www-form-urlencoded: key1=val1&key2=val2 url转码提交至后台,浏览器的原生 form 表单
             *
             * multipart/form-data 表单上传文件 form必须设置enctyped="multipart/form-data"
             *
             * application/json: {"title":"test","sub":[1,2,3]}  告诉服务端消息主体是序列化后的 JSON 字符串
             *
             * text/html: HTML格式
             * */
            "Content-type": httpConfig['content-type'] || 'application/json',
            /**
             *  自定义的字段： 可以作为和后台交互的唯一标识
             *  通常项目中请求头中加入token
             */
            // "token": "12345678979"
        }
    }
}

/**
 * 定义响应状态的结果集
 * @param callback 回掉数据值
 * @param error 失败
 * @param response 响应值
 * @param body 响应数据值
 */
function resultFn(callback, error, response, body) {
    if (!error && Number(response.statusCode) === 200) {
        body = JSON.parse(body)
        callback({success: true, data: body.result});
    } else {
        callback({
            success: false, data: {
                msg: 'Hello Word'
            }
        });
    }
}

module.exports = HttpRequestUtil
